package com.example.userconsumer.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Server-Sent Events (SSE) 是一种在服务器端向客户端发送实时更新的技术。
 * 与WebSocket不同，SSE是单向的，仅支持从服务器到客户端的通信。SSE使用HTTP协议，因此更容易通过防火墙和代理。
 * @author likaiping
 * @createTime 2024/7/7 17:36
 */
@RestController
public class SseController {

    private final List<SseEmitter> emitters = new ArrayList<>();

    @GetMapping("/subscribe")
    public SseEmitter subscribe() {
        SseEmitter emitter = new SseEmitter();
        emitters.add(emitter);
        emitter.onCompletion(() -> emitters.remove(emitter));
        emitter.onTimeout(() -> emitters.remove(emitter));
        return emitter;
    }

    // 接收到redis频道的消息时调用该方法
    public void sendNotification(String message) {
        for (SseEmitter emitter : emitters) {
            if (emitter != null) {
                try {
                    emitter.send(SseEmitter.event().name("message").data(message));
                } catch (IOException e) {
                    emitters.remove(emitter);
                }
            }
        }
    }
}
